﻿Public Class xtf_ABMrecibo

    Dim ulg_row As DataRow
    Dim obj_recibo As cls_recibo_ = Nothing
    Dim dtt_pendiente_ As DataTable

    Public Sub New()
        InitializeComponent()
        Cargartalonariorecibo_()
        Cargarcliente_()
        AgregarValidaciones()
        'Dim obj_config_parametro As New cls_config_parametro_
        'lbl_subcodigo3.Text = obj_config_parametro.obtener("nombreSubCodigo3")

        'Prepara grid y datasource proveedorarticulo----------------------------------------------------
        dtt_pendiente_ = New DataTable

        dtt_pendiente_.Columns.Add("Identificador (ID)")
        dtt_pendiente_.Columns.Add("Seleccionar", GetType(Boolean))
        dtt_pendiente_.Columns.Add("Fecha", GetType(DateTime))
        dtt_pendiente_.Columns.Add("Número")
        dtt_pendiente_.Columns.Add("Ingreso", GetType(Decimal))
        dtt_pendiente_.Columns.Add("Salida", GetType(Decimal))
        dtt_pendiente_.Columns.Add("Concepto")
        dtt_pendiente_.Columns.Add("Vencimiento", GetType(DateTime))
        dtt_pendiente_.Columns.Add("Pendiente", GetType(Decimal))
        dtt_pendiente_.Columns.Add("Pagado", GetType(Decimal))
        dtt_pendiente_.Columns.Add("asiento", GetType(cls_asiento_))
        dtt_pendiente_.Columns.Add("Objeto", GetType(cls_reciboimputacion_))

        gdc_pendiente_.DataSource = dtt_pendiente_
        gdv_pendiente_.PopulateColumns()

        gdv_pendiente_.Columns("Objeto").Visible = False
        gdv_pendiente_.Columns("asiento").Visible = False

        gdv_pendiente_.Columns("Identificador (ID)").OptionsColumn.AllowEdit = False
        gdv_pendiente_.Columns("Fecha").OptionsColumn.AllowEdit = False
        gdv_pendiente_.Columns("Número").OptionsColumn.AllowEdit = False
        gdv_pendiente_.Columns("Ingreso").OptionsColumn.AllowEdit = False
        gdv_pendiente_.Columns("Salida").OptionsColumn.AllowEdit = False
        gdv_pendiente_.Columns("Concepto").OptionsColumn.AllowEdit = False
        gdv_pendiente_.Columns("Vencimiento").OptionsColumn.AllowEdit = False
        gdv_pendiente_.Columns("Objeto").OptionsColumn.AllowEdit = False
        gdv_pendiente_.Columns("asiento").OptionsColumn.AllowEdit = False
        gdv_pendiente_.Columns("Pendiente").OptionsColumn.AllowEdit = False


        gdv_pendiente_.Columns("Ingreso").AppearanceHeader.TextOptions.HAlignment = DevExpress.Utils.HorzAlignment.Far
        gdv_pendiente_.Columns("Ingreso").AppearanceCell.TextOptions.HAlignment = DevExpress.Utils.HorzAlignment.Far
        gdv_pendiente_.Columns("Salida").AppearanceHeader.TextOptions.HAlignment = DevExpress.Utils.HorzAlignment.Far
        gdv_pendiente_.Columns("Salida").AppearanceCell.TextOptions.HAlignment = DevExpress.Utils.HorzAlignment.Far

        gdv_pendiente_.Columns("Pagado").ColumnEdit = New DevExpress.XtraEditors.Repository.RepositoryItemTextEdit
        CType(gdv_pendiente_.Columns("Pagado").ColumnEdit, DevExpress.XtraEditors.Repository.RepositoryItemTextEdit).Mask.MaskType = DevExpress.XtraEditors.Mask.MaskType.Numeric
        CType(gdv_pendiente_.Columns("Pagado").ColumnEdit, DevExpress.XtraEditors.Repository.RepositoryItemTextEdit).Mask.EditMask = "n" & int_cantdecimales
        CType(gdv_pendiente_.Columns("Pagado").ColumnEdit, DevExpress.XtraEditors.Repository.RepositoryItemTextEdit).Mask.UseMaskAsDisplayFormat = True
        AddHandler CType(gdv_pendiente_.Columns("Pagado").ColumnEdit, DevExpress.XtraEditors.Repository.RepositoryItemTextEdit).Click, AddressOf RepositoryItemTextEdit_Click

        FiltrarColumnas()
    End Sub

    Public Sub FiltrarColumnas()
        Dim int_IDUsuario As Integer = UsuarioLOG.idusuario
        Dim obj_config_usuariocolumna_ As New cls_config_usuariocolumna_
        gdv_pendiente_.BeginUpdate()
        If obj_config_usuariocolumna_.Buscarxidusuarioxmodulo(int_IDUsuario, Me.Name) Then
            SetLayoutData(gdv_pendiente_, obj_config_usuariocolumna_.xml)
        End If

        PerzonalizarControl(gdc_pendiente_)
        gdv_pendiente_.OptionsFilter.AllowFilterEditor = False
        gdv_pendiente_.OptionsView.ShowFilterPanelMode = DevExpress.XtraGrid.Views.Base.ShowFilterPanelMode.Never

        gdv_pendiente_.EndUpdate()
    End Sub

    Private Function GetLayoutData(ByRef prm_GridView As DevExpress.XtraGrid.Views.Grid.GridView) As Byte()
        Dim stream As New System.IO.MemoryStream()
        prm_GridView.SaveLayoutToStream(stream)
        Return stream.GetBuffer()
    End Function

    Private Sub SetLayoutData(ByRef prm_GridView As DevExpress.XtraGrid.Views.Grid.GridView, ByVal data As Byte())
        If data Is Nothing OrElse data.Length = 0 Then
            Return
        End If
        Dim stream As New System.IO.MemoryStream(data)
        Try
            prm_GridView.RestoreLayoutFromStream(stream)
        Catch ex As Exception
            Throw New Exception("Wrong data format", ex)
        End Try
    End Sub

    Public Overrides Sub CargarObjetos()
        'Cargartalonariorecibo_()
        'Cargarcliente_()
    End Sub
    Private Sub Cargartalonariorecibo_()
        Dim tmp_obj As Integer = 0
        tmp_obj = cbo_talonariorecibo.EditValue

        Dim talonariorecibo_ As New cls_talonariorecibo_
        talonariorecibo_.CargarTodos()
        cargarCombo(cbo_talonariorecibo, talonariorecibo_.Items)
        cbo_talonariorecibo.EditValue = IIf(tmp_obj <> 0, tmp_obj, cbo_talonariorecibo.EditValue)
    End Sub

    Private Sub Cargarcliente_()
        Dim tmp_obj As Integer = 0
        tmp_obj = cbo_tercero.EditValue

        Dim cliente_ As New cls_cliente_
        cliente_.CargarTodos(True)
        cargarCombo(cbo_tercero, cliente_.Items)
        cbo_tercero.EditValue = IIf(tmp_obj <> 0, tmp_obj, cbo_tercero.EditValue)
    End Sub

    Public Shadows Sub Nuevo(ByRef listado As Form)
        Try
            frm_listado = listado
            Me.Text = CType(frm_listado, xtf_ListadoBase).lbl_modulo.Text & " - Nuevo"
            obj_recibo = New cls_recibo_
            btn_Registro.Enabled = False
            dtp_fecha.EditValue = Now.Date
            Me.Show()
            cbo_tercero_EditValueChanged(Nothing, Nothing)
        Catch ex As Exception
            'Dim frmError As New frm_ErrorManager(ex.Message)
        End Try
    End Sub

    Public Shadows Sub Modificar(ByRef recibo As cls_recibo_, ByRef listado As Form, ByRef row As DataRow)
        If IsNothing(obj_recibo) Then
            obj_recibo = New cls_recibo_
        End If
        obj_recibo = recibo
        frm_listado = listado
        ulg_row = row : bbi_imprimir.Enabled = True

        Me.Text = CType(frm_listado, xtf_ListadoBase).lbl_modulo.Text & " - " & obj_recibo.ToString
        txt_ID.Text = obj_recibo.idrecibo
        txt_numero.Text = obj_recibo.numero
        cbo_talonariorecibo.EditValue = obj_recibo.idtalonario

        Dim cliente As New cls_cliente_
        cliente.BuscarXidtercero(obj_recibo.idtercero)
        cbo_tercero.EditValue = cliente.idcliente
        cbo_tercero_EditValueChanged(Nothing, Nothing)

        txt_observaciones.Text = obj_recibo.observaciones
        dtp_fecha.EditValue = obj_recibo.fecha
        txt_importe.Text = obj_recibo.importe

        If Not IsNothing(obj_recibo.reciboimputacion_) Then
            For Each reciboimputacion As cls_reciboimputacion_ In obj_recibo.reciboimputacion_.Items
                Dim bol_pendiente As Boolean = False
                For Each row_asiento As DataRow In dtt_pendiente_.Rows
                    If reciboimputacion.idasiento = row_asiento("asiento").idasiento Then
                        row_asiento("Pagado") += reciboimputacion.importe
                        If row_asiento("Pagado") = row_asiento("Ingreso") Or row_asiento("Pagado") = row_asiento("Salida") Then
                            row_asiento("Seleccionar") = True
                        End If
                        row_asiento("Objeto") = reciboimputacion
                        bol_pendiente = True
                        Exit For
                    End If
                Next
                If Not bol_pendiente Then
                    If Not IsNothing(reciboimputacion.asiento) Then
                        Dim row_asiento As DataRow = AgregarItem(reciboimputacion.asiento)
                        row_asiento("Pagado") += reciboimputacion.importe
                        If row_asiento("Pagado") = row_asiento("Ingreso") Or row_asiento("Pagado") = row_asiento("Salida") Then
                            row_asiento("Seleccionar") = True
                        End If
                        row_asiento("Objeto") = reciboimputacion
                        bol_pendiente = True
                    End If
                End If
            Next
        End If
        

        obj_recibo.talonariorecibo = Nothing
        obj_recibo.tercero = Nothing


      
        Me.Show()

    End Sub


    Public Function AgregarItem(ByRef asiento As cls_asiento_) As DataRow
        Dim dtt_row As DataRow = dtt_pendiente_.NewRow
        dtt_row("Identificador (ID)") = asiento.idasiento
        dtt_row("Fecha") = asiento.fecha.ToShortDateString
        If Not IsNothing(asiento.documento) Then
            dtt_row("Número") = Format(asiento.documento.numero, "0000000000")
        End If

        Select Case asiento.tipoimporte
            Case cls_asiento_.enu_tipoimporte.Ingreso
                dtt_row("Ingreso") = asiento.importe
                dtt_row("Salida") = 0
            Case cls_asiento_.enu_tipoimporte.Salida
                dtt_row("Salida") = asiento.importe
                dtt_row("Ingreso") = 0
        End Select
        dtt_row("asiento") = asiento
        dtt_row("Seleccionar") = False
        dtt_row("Pendiente") = asiento.pendiente
        dtt_row("Pagado") = 0
        If Not IsNothing(asiento.asientoconcepto) Then
            dtt_row("Concepto") = asiento.asientoconcepto.ToString
        End If
        dtt_row("Vencimiento") = asiento.vencimientoRE
        dtt_pendiente_.Rows.Add(dtt_row)
        Return dtt_row
    End Function

    Public Overrides Function ComprobarDatos() As Boolean
        If Not ControlarValidaciones() Then
            ErrManagerShow("000004", Me)
            Return False
        End If
        Return True
    End Function

    Public Shadows Sub btn_Guardar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btn_Guardar.Click
        If ComprobarDatos() Then
            obj_recibo.numero = txt_numero.Text
            obj_recibo.idtalonario = cbo_talonariorecibo.EditValue

            Dim cliente As New cls_cliente_
            cliente.Buscar(cbo_tercero.EditValue)
            obj_recibo.idtercero = cliente.idtercero

            obj_recibo.observaciones = txt_observaciones.Text
            obj_recibo.fecha = dtp_fecha.EditValue
            obj_recibo.importe = txt_importe.Text

            'Guardo documentodetalle------------------------------------------------------
            If IsNothing(obj_recibo.reciboimputacion_) Then
                obj_recibo.reciboimputacion_ = New cls_reciboimputacion_
            End If
            If IsNothing(obj_recibo.reciboimputacion_.Items) Then
                obj_recibo.reciboimputacion_.Items = New Collections.Generic.List(Of cls_reciboimputacion_)
            End If
            For Each Elemento As DataRow In dtt_pendiente_.Rows
                If Elemento("Pagado") <> 0 Then
                    Dim reciboimputacion As cls_reciboimputacion_
                    If IsDBNull(Elemento("Objeto")) Then
                        reciboimputacion = New cls_reciboimputacion_
                    Else
                        reciboimputacion = Elemento("Objeto")
                    End If
                    reciboimputacion.idasiento = Elemento("asiento").idasiento
                    reciboimputacion.importe = Elemento("Pagado")
                    obj_recibo.reciboimputacion_.Items.Add(reciboimputacion)
                Else
                    If Not IsNothing(Elemento("Objeto")) Then
                        If CType(Elemento("Objeto"), cls_reciboimputacion_).idreciboimputacion <> 0 Then
                            CType(Elemento("Objeto"), cls_reciboimputacion_).Eliminar(CType(Elemento("Objeto"), cls_reciboimputacion_).idreciboimputacion)
                        End If
                    End If
                End If
            Next
            'For Each Elemento As cls_documentodetalle_ In gdv_documentodetalle_.Tag
            '    If Elemento.iddocumentodetalle <> 0 Then
            '        Elemento.Eliminar(Elemento.iddocumentodetalle)
            '    End If
            'Next

            If Not IsNothing(obj_recibo.cajaasiento) Then
                obj_recibo.cajaasiento.importe = obj_recibo.importe
                obj_recibo.cajaasiento.Modificar()
            Else
                Dim caja As New cls_caja_
                If Not caja.BuscarXfechaXtipo(obj_recibo.fecha, cls_caja_.enu_tipo.Reparto) Then
                    caja.fecha = obj_recibo.fecha
                    caja.tipo = cls_caja_.enu_tipo.Reparto
                    caja.Nuevo(True)
                End If

                Dim cajaasiento As New cls_cajaasiento_
                cajaasiento.idcaja = caja.idcaja
                cajaasiento.idtercero = obj_recibo.idtercero
                cajaasiento.importe = obj_recibo.importe
                cajaasiento.tipoimporte = cls_cajaasiento_.enu_tipoimporte.Ingreso
                cajaasiento.tipo = cls_cajaasiento_.enu_tipo.Automatico
                cajaasiento.fecha = obj_recibo.fecha
                cajaasiento.iddocumento = obj_recibo.idrecibo
                cajaasiento.observaciones = Format(obj_recibo.numero, "0000000000")
                Dim parametroConcepto As New cls_config_parametro_
                parametroConcepto.Buscar("cajaasientoConceptoRecibo")
                cajaasiento.idcajaconcepto = parametroConcepto.valor
                cajaasiento.Nuevo(True)
                obj_recibo.idcajaasiento = cajaasiento.idcajaasiento
            End If

            If txt_ID.Text = "" Then
                obj_recibo.Nuevo(True)
                If Not IsNothing(obj_recibo.talonariorecibo) Then
                    obj_recibo.talonariorecibo.ultimo += 1
                    obj_recibo.talonariorecibo.Modificar()
                End If
                If frm_listado.Visible Then
                    ulg_row = CType(frm_listado, xtf_LISTADOrecibo_).AgregarItem(obj_recibo)
                End If
                obj_recibo.reciboimputacion_ = Nothing
                Modificar(obj_recibo, frm_listado, ulg_row)
            Else
                obj_recibo.Modificar()
                If frm_listado.Visible Then
                    CType(frm_listado, xtf_LISTADOrecibo_).ModificarItem(obj_recibo, ulg_row)
                End If
                obj_recibo.reciboimputacion_ = Nothing
                Modificar(obj_recibo, frm_listado, ulg_row)
            End If

            flg_Modificado = False : btn_Guardar.Enabled = False : bbi_guardar.Enabled = False
        End If
    End Sub

    Private Sub btn_Registro_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btn_Registro.Click
        If Not IsNothing(obj_recibo.registro) Then
            Dim ABMRegistro As New xtf_ABMRegistro(obj_recibo.registro)
            If ABMRegistro.ShowDialog() = Windows.Forms.DialogResult.OK Then
                flg_Modificado = True
            End If
        End If
    End Sub


    Private Sub btn_Cerrar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btn_Cerrar.Click
        If flg_Modificado Then
            bol_comprobarCerrado = False
            Select Case ErrManagerShow("000001", Me)
                Case Windows.Forms.DialogResult.Yes
                    If ComprobarDatos() Then
                        btn_Guardar_Click(Nothing, Nothing)
                    Else
                        Exit Sub
                    End If
                Case Windows.Forms.DialogResult.Cancel : bol_comprobarCerrado = True
                    Exit Sub
            End Select
        End If
        guardar_config_usuariocolumna_()
        Me.Dispose()
    End Sub

    Private Sub guardar_config_usuariocolumna_()
        gdv_pendiente_.OptionsFilter.AllowFilterEditor = False
        gdv_pendiente_.OptionsView.ShowFilterPanelMode = DevExpress.XtraGrid.Views.Base.ShowFilterPanelMode.Never
        Dim obj_config_usuariocolumna_ As New cls_config_usuariocolumna_
        If obj_config_usuariocolumna_.Buscarxidusuarioxmodulo(UsuarioLOG.idusuario, Me.Name) Then
            obj_config_usuariocolumna_.xml = GetLayoutData(gdv_pendiente_)
            obj_config_usuariocolumna_.Modificar()
        Else
            obj_config_usuariocolumna_.xml = GetLayoutData(gdv_pendiente_)
            obj_config_usuariocolumna_.idusuario = UsuarioLOG.idusuario
            obj_config_usuariocolumna_.modulo = Me.Name
            obj_config_usuariocolumna_.Nuevo()
        End If
    End Sub

    Private Sub cbo_talonariorecibo_EditValueChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cbo_talonariorecibo.EditValueChanged
        Dim talonariorecibo As New cls_talonariorecibo_
        If talonariorecibo.Buscar(cbo_talonariorecibo.EditValue) Then
            txt_numero.Text = talonariorecibo.ultimo
        End If
    End Sub

    Private Sub cbo_tercero_EditValueChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cbo_tercero.EditValueChanged
        'If Me.Visible Then
        Try
            dtt_pendiente_.Rows.Clear()
            Dim asiento_ As New cls_asiento_
            Dim cliente As New cls_cliente_
            If cliente.Buscar(cbo_tercero.EditValue) Then
                If asiento_.CargarXidtercero(cliente.idtercero) Then
                    For Each asiento As cls_asiento_ In asiento_.Items
                        AgregarItem(asiento)
                    Next
                End If
            End If
        Catch ex As Exception

        End Try

        'End If
    End Sub

    Private Sub gdv_pendiente__CellValueChanging(ByVal sender As Object, ByVal e As DevExpress.XtraGrid.Views.Base.CellValueChangedEventArgs) Handles gdv_pendiente_.CellValueChanging
        Select Case e.Column.FieldName
            Case "Seleccionar"
                Dim row As DataRow = gdv_pendiente_.GetDataRow(e.RowHandle)
                If e.Value = True Then
                    row("Pagado") = row("Pendiente")
                Else
                    row("Pagado") = 0
                End If
        End Select
    End Sub
End Class